﻿using System;
using System.Web.Mvc;
using Project.MVC;
using Project.MVC.PhanQuyen.Model;
using Project.MVC.PhanQuyen.Services;
using System.Collections.Generic;


namespace Project.Mvc.Web.Controllers
{
    public abstract class ApplicationController : ApplicationBaseController
    {
        protected string savedSuccessfulMessage = "Dữ liệu đã lưu thành công.";

        protected string savedNonSuccessfulMessage = "Dữ liệu không hợp lệ, vui lòng kiểm tra lại.";

        public ActionResult History()
        {
            try
            {
                    return RedirectToAction("Index");
            }
            catch
            {
                return RedirectToAction("Index", new { controller = "Home" });
            }
        }

        #region Public methods (non-action)     


        /// <summary>
        /// lấy vụ việc của người dùng theo quyền
        /// </summary>
        /// <param name="role"></param>
        /// <returns></returns>
        [NonAction]
        protected byte GetVuViec(string role)
        {
            return nguoiDungServices.GetTask(TenNguoiDung, role);
        }

        #endregion
    }

    public abstract class ApplicationBaseController : Controller
    {
        private string appPath;



        #region Thông tin người dùng đăng nhận hệ thống
        //ghi nhận thông tin truy xuất của người sử dụng
        private PQNhatKyInfo nhatKyInfo;

        protected readonly PQNguoiDungInfo CurrentUser;

        protected int idNguoiDung
        {
            get
            {
                return CurrentUser != null ? CurrentUser.Id : 0;
            }
        }
        protected string TenNguoiDung
        {
            get
            {
                return CurrentUser != null ? CurrentUser.TenNguoiDung : "";
            }
        }

        protected string HoTenNguoiDung
        {
            get
            {
                return CurrentUser != null ? CurrentUser.HoTenNguoiDung : "";
            }
        }

        

        

        protected static IPQNguoiDungServices nguoiDungServices;
        protected static IPQNhomSuDungServices nhomSuDungServices;

        protected void LogEvent(string thaoTac, string noiDung)
        {
            if (nhatKyInfo == null) nhatKyInfo = new PQNhatKyInfo();
            nhatKyInfo.ThoiGian = DateTime .Now;
            nhatKyInfo.TenNguoiDung = TenNguoiDung;
            nhatKyInfo.ThaoTac = thaoTac;
            nhatKyInfo.NoiDung = noiDung;
        }

        protected void LogEvent(string nguoiDung, string thaoTac, string noiDung, bool valid)
        {
            if (nhatKyInfo == null) nhatKyInfo = new PQNhatKyInfo();
            nhatKyInfo.ThoiGian = DateTime.Now;
            nhatKyInfo.TenNguoiDung = nguoiDung;            
            nhatKyInfo.ThaoTac = thaoTac;
            nhatKyInfo.NoiDung = noiDung;

            if (CurrentUser == null && valid)
            {//lấy thông tin liên quan người dùng
                var userInfo = nguoiDungServices.GetByKey(nguoiDung);
                if (userInfo != null)
                {
                //    userInfo.NhanVienInfo = new DMNhanVienServices().GetByKey(userInfo.MaNhanVien);

                //    nhatKyInfo.HoTenNguoiDung = userInfo.HoTenNguoiDung;
                //    if (userInfo.NhanVienInfo != null &&
                //        ((DMNhanVienInfo)userInfo.NhanVienInfo).SanGiaoDichInfo != null
                //        )
                //    {
                //        nhatKyInfo.SanGiaoDich = ((DMNhanVienInfo)userInfo.NhanVienInfo).SanGiaoDichInfo.TenSanGiaoDich;
                //    }
                }
                
            }
        }
       
        #endregion

        protected ApplicationBaseController()
        {
            if (nguoiDungServices == null)
                nguoiDungServices = new PQNguoiDungServices();
            if (nhomSuDungServices == null)
                nhomSuDungServices = new PQNhomSuDungServices();

            CurrentUser = null;

            //lấy thông tin người dùng từ cache
            var principal = (WSUserPrincipal)System.Web.HttpContext.Current.Cache.Get(System.Web.HttpContext.Current.User.Identity.Name);

            if ((principal != null) && !String.IsNullOrEmpty(principal.Identity.Name))
            {
                CurrentUser = principal.UserInfo;
            }

            ViewData["appPath"] = GetAppPath();

            //ViewData["decimalSymbol"] = DecimalSymbol = AppConfigModel.DecimalSymbol;
            //ViewData["groupingSymbol"] = GroupingSymbol = AppConfigModel.GroupingSymbol;
            //ViewData["decimalPlaces"] = DecimalPlaces = AppConfigModel.DecimalPlaces;
            //ViewData["currencyFormat"] = CurrencyFormat = AppConfigModel.CurrencyFormat;
            //ViewData["roundRule"] = RoundRule = AppConfigModel.RoundRule;
            //ViewData["addLate"] = AddLate = AppConfigModel.AddLate;

            ViewData["userId"] = CurrentUser != null ? CurrentUser.Id : 0;
            ViewData["username"] = CurrentUser != null ? CurrentUser.HoTenNguoiDung : "";
            if (CurrentUser != null)
            {
                List<PQNhomSuDungInfo> listNhomSuDung = nhomSuDungServices.NhomSuDungTheoNguoiSuDung(CurrentUser.Id);
                bool chuyenAn = KiemTraNhomSuDung(listNhomSuDung, NhomSuDungEnum.chuyenan.ToString());
                ViewData["chuyenAn"] = chuyenAn;
                bool admin = KiemTraNhomSuDung(listNhomSuDung, NhomSuDungEnum.admin.ToString());
                ViewData["admin"] = admin;
                bool banGD = KiemTraNhomSuDung(listNhomSuDung, NhomSuDungEnum.bangd.ToString());
                ViewData["banGD"] = banGD;
                bool hienTruong = KiemTraNhomSuDung(listNhomSuDung, NhomSuDungEnum.hientruong.ToString());
                ViewData["hienTruong"] = hienTruong;
                bool hopDong = KiemTraNhomSuDung(listNhomSuDung, NhomSuDungEnum.hopdong.ToString());
                ViewData["hopDong"] = hopDong;
                bool congNo = KiemTraNhomSuDung(listNhomSuDung, NhomSuDungEnum.congno.ToString());
                ViewData["congNo"] = congNo;
                bool phapLy = KiemTraNhomSuDung(listNhomSuDung, NhomSuDungEnum.phaply.ToString());
                ViewData["phapLy"] = phapLy;
                bool banHang = KiemTraNhomSuDung(listNhomSuDung, NhomSuDungEnum.banhang.ToString());
                ViewData["banHang"] = banHang;
                bool nhanvienbanHang = KiemTraNhomSuDung(listNhomSuDung, NhomSuDungEnum.nhanvienbanhang.ToString());
                ViewData["nhanVienBanHang"] = nhanvienbanHang;
            }
        }
        // Kiểm tra user login thuộc nhóm sử dụng nào

        bool KiemTraNhomSuDung(List<PQNhomSuDungInfo> listNhomSuDung, string maNhom)
        {
            bool result = false;
            foreach (PQNhomSuDungInfo item in listNhomSuDung)
            {
                if (item.maNhom != null)
                {
                    if (item.maNhom.Equals(maNhom))
                    {
                        result = true;
                        break;
                    }
                }

            }
            return result;
        }
        // LẤY ĐƯỜNG DẪN CỦA HỆ THỐNG
        public string GetAppPath()
        {
            appPath = System.Web.HttpContext.Current.Request.ApplicationPath;
            if (appPath == string.Empty || appPath.Equals("/")) appPath = "";
            return appPath;
        }

        protected override void OnException(ExceptionContext filterContext)
        {
            if (filterContext.Exception != null)
            {
                if (filterContext.Exception.Message.ToLower().Contains("object reference not set to an instance of an object."))
                {
                    RedirectToAction("LogOn?errTimeOut=true", "Home");
                }
            }
            base.OnException(filterContext);

        }        
    }
}